package com.bookmanagement.util;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.crypto.SecretKey;
import java.util.Date;

/**
 * JWT 工具类，用于生成和解析 JWT 令牌
 */
@Component
public class JwtUtil {
    @Value("${jwt.secret}") // 从配置文件（如application.yml）中读取jwt.secret配置项作为密钥
    private String secret; // JWT 密钥

    /**
     * 生成 JWT 令牌
     * @param userId 用户ID
     * @param username 用户名
     * @return JWT 令牌
     */
    public String generateToken(Long userId, String username) {
        SecretKey key = Keys.hmacShaKeyFor(secret.getBytes()); // 生成 HMAC-SHA 密钥
        return Jwts.builder()
                .subject(username)
                .claim("id", userId)
                .issuedAt(new Date())
                .expiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24)) // 24小时有效
                .signWith(key) // 使用 HMAC-SHA 签名
                .compact();
    }//登录成功后，根据用户 ID 和用户名生成包含用户信息的令牌，返回给前端。

    /**
     * 从 JWT 令牌中提取用户ID
     * @param token JWT 令牌
     * @return 用户ID
     */
    public Long getUserIdFromToken(String token) {
        SecretKey key = Keys.hmacShaKeyFor(secret.getBytes());
        Claims claims = Jwts.parser()
                .verifyWith(key)
                .build()
                .parseSignedClaims(token)
                .getPayload();
        return claims.get("id", Long.class);
    }
}